package cn.edu.sdjzu.xg.bysj.dao;

import cn.edu.sdjzu.xg.bysj.domain.authority.Actor;
import cn.edu.sdjzu.xg.bysj.service.StudentService;
import cn.edu.sdjzu.xg.bysj.service.TeacherService;
import util.JdbcHelper;

import java.sql.*;

public final class ActorDao {
    private static final ActorDao actorDao = new ActorDao();

    private ActorDao() {
    }

    public static ActorDao getInstance() {
        return actorDao;
    }

    /**
     * 根据id，查找Actor各个子类的对象
     *
     * @param connection
     * @param id         目标对象的id
     * @return id对应的目标对象
     * @throws SQLException
     */
    public Actor find(Connection connection, int id) throws SQLException {
        //先后在Sudent和Teacher中查找相应的id
        Actor desiredActor = null;
        //查询id对应的Student对象
        desiredActor = StudentService.getInstance().find(id);
        if (desiredActor != null) {
            return desiredActor;
        }
        //查询id对应的Teacher对象
        desiredActor = TeacherService.getInstance().find(id);
        return desiredActor;
        //在各子类对象中均未查询到
    }


    /**
     * 这个方法不传入实体对象参数，可以考虑抽取到公共的类中。
     * 由于Teacher扩展了Actor，前者对象id取后者的id的值。
     * Actor是个抽象类，不能创建对象。
     * Actor表是必须存在，用来生成id值，以便子类对象对应的表使用这个id
     *
     * @param connection 来自Service的Connection对象
     * @return 成功增加：新对象的id，失败：0
     * @throws SQLException
     */
    public int add(Connection connection) throws SQLException {
        //根据连接对象准备语句对象，如果SQL语句为多行，注意语句不同部分之间要有空格
        PreparedStatement preparedStatement_actor =
                connection.prepareStatement(
                        "INSERT INTO actor () VALUES ()",
                        Statement.RETURN_GENERATED_KEYS);//要求返回新加元组的主键
        //执行预编译语句，用其返回值、影响的行数为赋值affectedRowNum
        int affectedRowNum = preparedStatement_actor.executeUpdate();
        int idOfAddedActor = 0;
        ResultSet resultSet = preparedStatement_actor.getGeneratedKeys();//获得生成的主键集合
        if (resultSet.next()) {
            idOfAddedActor = resultSet.getInt(1);//读取第一个主键
        }
        //本方法是事务的一部分，不能释放数据库连接
        JdbcHelper.close(preparedStatement_actor);
        //新增元组的id
        return idOfAddedActor;
    }


    /**
     {
     "指导教师角色":
     [{"description":"方向管理",
     "url":"openArea.ctl",
     "no":"21"},
     {"description":"课题管理",
     "url":"project.ctl",
     "no":"22"}
     ],
     "评阅人角色":
     [{"description":"评阅",
     "url":"review.ctl",
     "no":"21"}
     ],
     "答辩委员角色":
     [{"description":"答辩",
     "url":"oralDefense.ctl",
     "no":"21"}
     ],

     "答辩组长角色":
     [{"description":"答辩成绩",
     "url":"oralDefenseComeout.ctl",
     "no":"21"},
     {"description":"推荐优秀成果",
     "url":"oralDefenseRecommendation.ctl",
     "no":"21"}
     ]
     }
     */
}
